#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

// lamdba 表达式
/*
    [捕获列表](参数)->return type{ function body};
    参数可以被省略(若不存在参数 存在参数则不可省略)
    返回值可以省略
    但若是需要将返回值设定为需要返回的类型则不可省略
    例如返回默认类型为double 类型而需要返回int 类型
*/

// int main() {
//   //   cout << "hello world" << endl;

//   auto lamdba = [] {
//     cout << "hello world" << endl;
//   };
//   lamdba();
//   cout << typeid(lamdba).name() << endl;

//   return 0;
// }

//-------------

// struct Myclass {
//   string _name;
//   int _year;
//   int _height;

//   Myclass(const string &name, int year, int height)
//       : _name(name), _year(year), _height(height) {}
// };

// void VPrint(const vector<Myclass>& v) {
//   for (auto it : v) {
//     cout << it._name << endl;
//   }
//   cout << "#################################" << endl;
// }

// int main() {
//   vector<Myclass> v= {{"First", 20, 30}, {"Second", 30, 60}, {"Third", 50, 33}};
//   sort(v.begin(), v.end(), [](const Myclass& m1, const Myclass& m2) -> bool {
//     return m1._height < m2._height;
//   });
//   VPrint(v);
  
//   sort(v.begin(), v.end(), [](const Myclass& m1, const Myclass& m2) -> bool {
//     return m1._height > m2._height;
//   });
//   VPrint(v);

//   sort(v.begin(), v.end(), [](const Myclass& m1, const Myclass& m2) -> bool {
//     return m1._name < m2._name;
//   });
//   VPrint(v);

//   sort(v.begin(), v.end(), [](const Myclass& m1, const Myclass& m2) -> bool {
//     return m1._name > m2._name;
//   });
//   VPrint(v);

//   sort(v.begin(), v.end(), [](const Myclass& m1, const Myclass& m2) -> bool {
//     return m1._year < m2._year;
//   });
//   VPrint(v);

//   sort(v.begin(), v.end(), [](const Myclass& m1, const Myclass& m2) -> bool {
//     return m1._year > m2._year;
//   });
//   VPrint(v);
//   return 0;
// }

//-------------

int main() {
  int x = 1, y = 0;
  auto swap1 = [](int& x, int& y) {
    int tmp = x;
    x = y;
    y = tmp;
  };
  swap1(x, y);
  cout << x << " " << y << endl;
  
  auto swap2 = [&x, &y] {
    int tmp = x;
    x = y;
    y = tmp;
  };
  swap2();
  cout << x << " " << y << endl;

  auto swap3 = [&] {
    int tmp = x;
    x = y;
    y = tmp;
  };
  swap3();

  cout << x << " " << y << endl;

  return 0;
}